package cn.micai.base.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

/**
 * @Auther: zhaoxinguo
 * @Date: 2018/8/24 10:04
 * @Description:
 */
public class ZookeeperApiDemo {

    public static void main(String [] args) throws Exception {
        String url = "127.0.0.1";
        int sessionTimeout = 1000;
        ZooKeeper zooKeeper = new ZooKeeper(url, sessionTimeout, null);

        // 创建节点
        // 创建/root节点，其包含的数据为"root data"，访问权限为开放，所有人均可以访问，创建模式为持久化节点
        zooKeeper.create("/root", "root data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        // 删除节点
        zooKeeper.delete("/root", -1);

        // 设置和获取节点内容
        // 一个znode中最多能保存1MB的数据
        // 设置/root节点的数据，版本号为-1，如果匹配不到相应的节点，会抛出异常
        zooKeeper.setData("/root", "hello".getBytes(), -1);
        // 取得/root节点的数据，并返回其stat
        Stat stat = new Stat();
        // getData方法取得root节点上保存的字节数据，false表示不使用默认的watcher，
        // 第三个参数为stat，表示节点的状态，是一个传出的参数，将会返回该节点当前的昨天信息
        byte[] data = zooKeeper.getData("/root", false, stat);

        // 创建子节点，但父节点必须存在，否则会抛出异常
        zooKeeper.create("/root/child", "child data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        // 判断子节点是否存在
        if (zooKeeper.exists("/root/child", false) == null) {
            System.out.println("节点不存在");
        } else {
            System.out.println("节点存在");
        }

    }
}
